﻿// C. Powers Of Two.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1095/C

如果一个正整数 x 可以表示为 x=2y，其中 y 是一个非负整数，那么这个正整数 x 就叫做 2 的幂。因此，2 的幂是 1、2、4、8、16、....。

给你两个正整数 n 和 k，你的任务是将 n 表示为 k 个二的幂之和。

输入
输入的唯一一行包含两个整数 n 和 k（1≤n≤109，1≤k≤2⋅105）。

输出
如果无法将 n 表示为 k 个 2 的幂的和，则打印 “否”。

否则，打印 “是”，然后打印 k 个正整数 b1,b2,...,bk，使得每个 bi 都是 2 的幂，
且 ∑i=1kbi=n。如果有多个答案，可以打印其中任意一个。

Examples
InputCopy
9 4
OutputCopy
YES
1 2 2 4
InputCopy
8 1
OutputCopy
YES
8
InputCopy
5 1
OutputCopy
NO
InputCopy
3 7
OutputCopy
NO
*/

#include <iostream>
#include <vector>


using namespace std;

int n, k;

vector<int> ans;

bool dfs(int x,int cnt) {
	if (cnt == 1 && x != 0) {
		ans.push_back(x);
		return true;
	}
	if (x == 0) return false;
	if (dfs(x / 2, cnt / 2) && dfs(x / 2, cnt - cnt / 2)) {
		return true;
	}

	return false;
}

int main()
{
	cin >> n >> k;
	int cn = n;
	vector<int> v;
	int curr = 1;
	while (n) {
		if (n & 1) v.push_back(curr);
		curr <<= 1;
		n >>= 1;
	}
	if (k == v.size()) {
		cout << "YES" << endl;
		for (int j = v.size() - 1; j >= 0; j--) {
			cout << v[j] << " ";
		}
		return 0;
	}
	if (k == cn) {
		cout << "YES" << endl;
		for (int i = 1; i <= cn; i++) {
			cout << 1 << " ";
		}
		return 0;
	}

	int len = v.size();
	if (len > k || k>cn) {
		cout << "NO" << endl;
		return 0;
	}
	else {
		for (int i = v.size() - 1; i >= 0 ; i--) {
			int t = v[i];
			if (t <= k-i) {
				for (int i = 1; i <= t; i++) ans.push_back(1);
				k -= t;
			}
			else {
				cout << "YES" << endl;
				k -= i;
				for (int j = i - 1; j >= 0; j--) ans.push_back(v[j]);
				dfs(t, k);
				for (int i = 0; i < ans.size(); i++) cout << ans[i] << " ";
				return 0;
			}
		}
	}

	cout << "NO" << endl;

	return 0;
}

 